﻿using DB;
using log4net;
using log4net.Config;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Web.UI.WebControls;
using System.Windows.Forms;

namespace Elixi_AntdUi
{
    internal static class Program
    {
        private static MainWindow_In MainWindow_In;
        private static login _login;
        private static AntdUI.Window window;
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {

            Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
             //若文字不清晰，切换其他渲染方式
            AntdUI.Config.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
            AntdUI.Config.TextRenderingHighQuality = true; 


            // 初始化log4net
            ConfigureLogging();

            // 记录启动信息
            LogStartupInfo();

            // 加载配置文件
            var config = AppConfig.LoadConfig();
            SqlSugarHelper.Initialize(config.DatabaseConfig.ConnectionString, config.DatabaseConfig.DbType, config.DatabaseConfig.IsAutoCloseConnection);
             
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            // 先显示登录窗体
            using (var loginForm = new login())
            {
                // 显示登录窗体并等待结果
                if (loginForm.ShowDialog() == DialogResult.OK)
                {
                    //入库
                    if (config.AllConfig.IsInOrOut == 0 )
                    {
                        // 登录成功，启动主应用
                        Application.Run(new MainWindow_In());
                    }
                    //出库
                    else if (config.AllConfig.IsInOrOut == 1)
                    {
                        // 登录成功，启动主应用
                        Application.Run(new MainWindow_Out());
                    }
                    else
                    {
                        MessageBox.Show($"请检查配置文件是否正确！[IsInOrOut:{config.AllConfig.IsInOrOut}]", "配置错误",
                               MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return;
                    }
                }
                // 登录失败或取消，应用程序自然退出
            }
        }

        // 捕获UI线程中的未处理异常
        static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
        {
            AntdUI.Notification.error(MainWindow_In, "未处理的UI线程异常", e.Exception.Message, autoClose: 3, align: AntdUI.TAlignFrom.TR);
        }

        // 捕获非UI线程中的未处理异常
        static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            AntdUI.Notification.error(MainWindow_In, "未处理的非UI线程异常", e.ToString(), autoClose: 3, align: AntdUI.TAlignFrom.TR);
        }
        /// <summary>
        /// 配置日志系统
        /// </summary>
        private static void ConfigureLogging()
        {
            try
            {
                // 1. 获取日志配置文件路径
                string configPath = Path.Combine(
                    AppDomain.CurrentDomain.BaseDirectory,
                    "log4net.config");

                // 2. 确保配置文件存在
                if (!File.Exists(configPath))
                {
                    // 创建默认配置（可选）
                    CreateDefaultConfig(configPath);
                }

                // 3. 加载配置文件
                XmlConfigurator.ConfigureAndWatch(new FileInfo(configPath));

                // 4. 记录配置信息
                var logger = LogManager.GetLogger(typeof(Program));
                logger.Info($"日志系统初始化完成，基础目录: {Log4.BaseLogDirectory}");
            }
            catch (Exception ex)
            {
                // 日志系统初始化失败时的备用方案
                MessageBox.Show($"日志初始化失败: {ex.Message}\n" +
                    $"应用将继续运行，但日志功能不可用。",
                    "系统错误",
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// 创建默认日志配置（当配置文件不存在时）
        /// </summary>
        private static void CreateDefaultConfig(string configPath)
        {
            string defaultConfig = @"<?xml version=""1.0"" encoding=""utf-8""?>
<log4net>
  <!-- 全局设置 -->

  <!-- ============================================= -->
  <root>
    <level value=""DEBUG"" />
    <appender-ref ref=""ConsoleAppender"" />
  </root>
  <!-- ============================================= -->
 
  <!-- ============================================= -->
  
  <!-- 关键组件启用DEBUG -->
  <logger name=""MyApp.PaymentGateway"">
    <level value=""DEBUG"" />
  </logger>

  <!-- ============================================= -->
  <!-- 性能优化配置 -->
  <!-- 异步日志附加器 -->
  <appender name=""AsyncFileAppender"" type=""log4net.Appender.AsyncAppender"">
    <appender-ref ref=""GlobalFileAppender"" />
    <bufferSize value=""512"" />
    <lossy value=""false"" />
  </appender>

  <!-- 限制日志输出量 -->
  <logger name=""Noisy.ThirdParty.Lib"">
    <level value=""WARN"" />
  </logger>
  <!-- ============================================= -->


  <!-- ============================================= -->
  <!-- 安全配置建议 -->
  <!-- 过滤敏感信息 -->
  <appender name=""SecureFileAppender"" type=""log4net.Appender.RollingFileAppender"">
    <file value=""Logs/Secure.log"" />
    <layout type=""log4net.Layout.PatternLayout"">
      <conversionPattern value=""%date [%thread] %-5level - %replace{%message}{'\d{4}-\d{2}-\d{4}','***-***-****'}%newline"" />
    </layout>
  </appender>
  <!-- ============================================= -->

  <!-- ============================================= -->
  <!-- 权限设置 -->
  <!-- 使用环境变量确保跨平台兼容 -->
  <file type=""log4net.Util.PatternString"" value=""%env{FOLDERID_ProgramData}\MyApp\Logs\Global.log"" />
  <!-- ============================================= -->

  
  
  <!-- ============================================= -->
  <!-- 可选：全局附加器配置 (不影响自定义日志路径) -->
  <!-- ============================================= -->

  <!-- 控制台输出 (开发时使用) -->
  <appender name=""ConsoleAppender"" type=""log4net.Appender.ConsoleAppender"">
    <layout type=""log4net.Layout.PatternLayout"">
      <conversionPattern value=""%date [%thread] %-5level %logger - %message%newline"" />
    </layout>
  </appender>

  <!-- 全局文件日志 -->
  <appender name=""GlobalFileAppender"" type=""log4net.Appender.RollingFileAppender"">
    <!-- 使用相对路径（相对于应用根目录） -->
    <file value=""Logs/Application.log"" />
    <appendToFile value=""true"" />
    <rollingStyle value=""Composite"" />
    <maxSizeRollBackups value=""30"" />
    <maximumFileSize value=""10MB"" />
    <datePattern value=""_yyyy-MM-dd'.log'"" />
    <layout type=""log4net.Layout.PatternLayout"">
      <conversionPattern value=""%date [%thread] %-5level %logger - %message%newline"" />
    </layout>
  </appender>


  <!-- ============================================= -->
  <!-- 自定义日志记录器配置 (由Log4类动态创建) -->
  <!-- ============================================= -->

  <!-- 
    不需要在此配置自定义路径的日志记录器
    Log4类会在运行时动态创建它们
  -->
</log4net>";

            // 确保目录存在
            Directory.CreateDirectory(Path.GetDirectoryName(configPath));
            File.WriteAllText(configPath, defaultConfig);
        }

        /// <summary>
        /// 记录启动信息
        /// </summary>
        private static void LogStartupInfo()
        {
            try
            {
                // 记录应用启动信息
                string appName = Application.ProductName;
                string version = Application.ProductVersion;
                string osVersion = Environment.OSVersion.VersionString;

                // 使用Log4类记录到自定义路径
                Log4.Info("System/Startup",
                    $"应用程序启动: {appName} v{version}\n" +
                    $"启动时间: {DateTime.Now}\n" +
                    $"操作系统: {osVersion}\n" +
                    $"工作目录: {Environment.CurrentDirectory}\n" +
                    $"根目录: {Log4.BaseLogDirectory}");

                // 记录环境信息
                Log4.Info("System/Startup",
                    $"用户名: {Environment.UserName}\n" +
                    $"机器名: {Environment.MachineName}\n" +
                    $"处理器数: {Environment.ProcessorCount}\n" +
                    $".NET 版本: {Environment.Version}");
            }
            catch
            {
                // 启动日志记录失败时不中断应用
            }
        }
    }
}
